package models

// OAuth2RegisteredClient 客户端登录信息
type OAuth2RegisteredClient struct {
	Id           string `json:"id,omitempty" gorm:"column:id;primary_key;type:varchar(100)"`
	ClientId     string `json:"client_id,omitempty" gorm:"column:client_id;type:varchar(100)"`
	ClientSecret string `json:"client_secret,omitempty" gorm:"column:client_secret;type:varchar(100)"`
	ClientName   string `json:"client_name,omitempty" gorm:"column:client_name;type:varchar(20)"`

	// 三种模式authorization_code，refresh_token，client_credentials
	AuthorizationGrantTypes string `json:"authorization_grant_types,omitempty" gorm:"column:authorization_grant_types;type:varchar(100)"`
	RedirectUris            string `json:"redirect_uris,omitempty" gorm:"column:redirect_uris;type:varchar(300)"`
	Scopes                  string `json:"scopes,omitempty" gorm:"column:scopes;type:varchar(200)"`

	// 时间戳，秒级别
	AuthorizationCodeExpires int64 `json:"authorization_code_expires,omitempty" gorm:"authorization_code_expires"` // 默认5分钟，5*60
	AccessTokenExpires       int64 `json:"access_token_expires,omitempty" gorm:"access_token_expires"`             // 默认24小时，24*60*60
	RefreshTokenExpires      int64 `json:"refresh_token_expires,omitempty" gorm:"refresh_token_expires"`           // 默认7天，7*24*60*60
}

func (OAuth2RegisteredClient) TableName() string {
	return "oauth2_registered_client"
}

// OAuth2Authorization 授权信息表
type OAuth2Authorization struct {
	Id                      string `json:"id,omitempty" gorm:"column:id;primary_key;type:varchar(100)"`
	RegisteredClientId      string `json:"registered_client_id,omitempty" gorm:"column:registered_client_id;type:varchar(100)"`           // 什么客户端需要授权
	PrincipalName           string `json:"principal_name,omitempty" gorm:"column:principal_name;type:varchar(50)"`                        // 谁在授权
	AuthorizationGrantTypes string `json:"authorization_grant_types,omitempty" gorm:"column:authorization_grant_types;type:varchar(255)"` // 指定了某个授权模式

	// 新增一个，可以存储任意授权信息，先存一个重定向url
	Attribute string `json:"attribute,omitempty" gorm:"column:attribute;type:varchar(1000)"`

	State                      string `json:"state,omitempty" gorm:"column:state;type:varchar(100)"`                                       // 状态码，非必须，没有就不验证，由前端返回
	AuthorizationCodeValue     string `json:"authorization_code_value,omitempty" gorm:"column:authorization_code_value;type:varchar(150)"` // code码
	AuthorizationCodeExpiresAt int64  `json:"authorization_code_expires_at,omitempty" gorm:"column:authorization_code_expires_at"`         // code过期时间
	CodeChallengeValue         string `gorm:"column:code_challenge_value;type:varchar(200)"`
	CodeChallengeMethod        string `gorm:"column:code_challenge_method;type:varchar(10)"`
	CodeChallengeExpiresAt     int64  `gorm:"column:code_challenge_expires_at"`
	AccessTokenValue           string `json:"access_token_value,omitempty" gorm:"column:access_token_value;type:varchar(1000)"`  // token
	AccessTokenExpiresAt       int64  `json:"access_token_expires_at,omitempty" gorm:"column:access_token_expires_at"`           // token过期时间
	AccessTokenType            string `json:"access_token_type,omitempty" gorm:"column:access_token_type;type:varchar(10)"`      // token类型，一般都是 Bearer
	AccessTokenScopes          string `json:"access_token_scopes,omitempty" gorm:"column:access_token_scopes;type:varchar(100)"` // token的范围，由申请时标记
	OidcIdTokenValue           string `json:"oidc_id_token_value,omitempty" gorm:"column:oidc_id_token_value;type:varchar(100)"` // openid
	OidcIdTokenExpiresAt       int64  `json:"oidc_id_token_expires_at,omitempty" gorm:"column:oidc_id_token_expires_at"`         // openid过期时间
	RefreshTokenValue          string `json:"refresh_token_value,omitempty" gorm:"column:refresh_token_value;type:varchar(100)"` // 刷新token
	RefreshTokenExpiresAt      int64  `json:"refresh_token_expires_at,omitempty" gorm:"column:refresh_token_expires_at"`         // 刷新token过期时间
}

func (OAuth2Authorization) TableName() string {
	return "oauth2_authorization"
}

// OAuth2AuthorizationConsent 这个表很有意思，用于记录该用户授权了那些范围scope
type OAuth2AuthorizationConsent struct {
	RegisteredClientId string `json:"registered_client_id,omitempty" gorm:"column:registered_client_id;type:varchar(100)"` // 什么客户端
	PrincipalName      string `json:"principal_name,omitempty" gorm:"column:principal_name;type:varchar(100)"`             // 谁在授权
	Authorities        string `json:"authorities,omitempty" gorm:"column:authorities;type:varchar(100)"`                   // 授权了那些SCOPE，用scope-tag标记
}

func (OAuth2AuthorizationConsent) TableName() string {
	return "oauth2_authorization_consent"
}
